Allow SortableEvents to use keys other than `events_order`

Akinori MUSHA 8 years ago
parent
commit
adab96bb97
1 changed files with 14 additions and 12 deletions
  1. 14 12
      app/concerns/sortable_events.rb

+ 14 - 12
app/concerns/sortable_events.rb

@@ -5,6 +5,8 @@ module SortableEvents
5 5
     validate :validate_events_order
6 6
   end
7 7
 
8
+  EVENTS_ORDER_KEY = 'events_order'.freeze
9
+
8 10
   def description_events_order(*args)
9 11
     self.class.description_events_order(*args)
10 12
   end
@@ -23,9 +25,9 @@ module SortableEvents
23 25
       !can_order_created_events?
24 26
     end
25 27
 
26
-    def description_events_order(events = 'events created in each run')
28
+    def description_events_order(events = 'events created in each run', events_order_key = EVENTS_ORDER_KEY)
27 29
       <<-MD.lstrip
28
-        To specify the order of #{events}, set `events_order` to an array of sort keys, each of which looks like either `expression` or `[expression, type, descending]`, as described as follows:
30
+        To specify the order of #{events}, set `#{events_order_key}` to an array of sort keys, each of which looks like either `expression` or `[expression, type, descending]`, as described as follows:
29 31
 
30 32
         * _expression_ is a Liquid template to generate a string to be used as sort key.
31 33
 
@@ -48,8 +50,8 @@ module SortableEvents
48 50
     self.class.cannot_order_created_events?
49 51
   end
50 52
 
51
-  def events_order
52
-    options['events_order']
53
+  def events_order(key = EVENTS_ORDER_KEY)
54
+    options[key]
53 55
   end
54 56
 
55 57
   module AutomaticSorter
@@ -102,8 +104,8 @@ module SortableEvents
102 104
   }
103 105
   EXPRESSION_TYPES = EXPRESSION_PARSER.keys.freeze
104 106
 
105
-  def validate_events_order
106
-    case order_by = events_order
107
+  def validate_events_order(events_order_key = EVENTS_ORDER_KEY)
108
+    case order_by = events_order(events_order_key)
107 109
     when nil
108 110
     when Array
109 111
       # Each tuple may be either [expression, type, desc] or just
@@ -113,29 +115,29 @@ module SortableEvents
113 115
         when String
114 116
           # ok
115 117
         else
116
-          errors.add(:base, "first element of each events_order tuple must be a Liquid template")
118
+          errors.add(:base, "first element of each #{events_order_key} tuple must be a Liquid template")
117 119
           break
118 120
         end
119 121
         case type
120 122
         when nil, *EXPRESSION_TYPES
121 123
           # ok
122 124
         else
123
-          errors.add(:base, "second element of each events_order tuple must be #{EXPRESSION_TYPES.to_sentence(last_word_connector: ' or ')}")
125
+          errors.add(:base, "second element of each #{events_order_key} tuple must be #{EXPRESSION_TYPES.to_sentence(last_word_connector: ' or ')}")
124 126
           break
125 127
         end
126 128
         if !desc.nil? && boolify(desc).nil?
127
-          errors.add(:base, "third element of each events_order tuple must be a boolean value")
129
+          errors.add(:base, "third element of each #{events_order_key} tuple must be a boolean value")
128 130
           break
129 131
         end
130 132
       end
131 133
     else
132
-      errors.add(:base, "events_order must be an array of arrays")
134
+      errors.add(:base, "#{events_order_key} must be an array of arrays")
133 135
     end
134 136
   end
135 137
 
136 138
   # Sort given events in order specified by the "events_order" option
137
-  def sort_events(events)
138
-    order_by = events_order.presence or
139
+  def sort_events(events, events_order_key = EVENTS_ORDER_KEY)
140
+    order_by = events_order(events_order_key).presence or
139 141
       return events
140 142
 
141 143
     orders = order_by.map { |_, _, desc = false| boolify(desc) }